home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr48 / qoutstuf.zip / LINEEDIT.PAS < prev    next >
Pascal/Delphi Source File  |  1993-04-07  |  9KB  |  391 lines

  1. {$R-,S-,I-,D-,F+,V-,B-,N-,L+,O+ }
  2. unit lineedit;
  3.  
  4. interface
  5.  
  6. uses gentypes,configrt,gensubs,subs1,subs2,windows;
  7.  
  8. function linereedit (var m:message; gettitle:boolean):boolean;
  9.  
  10. implementation
  11.  
  12. function linereedit (var m:message; gettitle:boolean):boolean;
  13. var done,editmode:boolean;
  14.     curline,r1,r2,cols:integer;
  15.  
  16.   procedure init;
  17.   begin
  18.     if eightycols in urec.config
  19.       then cols:=79
  20.       else cols:=39;
  21.     linereedit:=false;
  22.     done:=false;
  23.     editmode:=false;
  24.     curline:=1;
  25.     if m.numlines=0
  26.       then begin
  27.       clearscr;
  28.       writeln(^R'[ MSi v'+^S+versionnum+' '+date+^R+' Line Editor ]');
  29.       writeln(^M^R'Title   : '^S,m.title);
  30.       writeln(^R'Send to : '^S,m.sendto);
  31.       writeln (^M^R^B'Enter text, ',maxmessagesize,' lines at most')
  32.       end
  33.       else begin
  34.         writeln (^B^M'Re-editing message.');
  35.         writeln ('Current size: '^S,m.numlines);
  36.         writeln ('Note: Inserting before line 1.');
  37.         writeln ('/A will abort changes.'^M)
  38.       end;
  39.     writeln ('Enter /? for help on / commands'^B^M)
  40.   end;
  41.  
  42.   procedure setbreak;
  43.   begin
  44.     clearbreak;
  45.     nobreak:=true;
  46.     dontstop:=true;
  47.     wordwrap:=true;
  48.     linecount:=0
  49.   end;
  50.  
  51.   function msgisblank:boolean;
  52.   begin
  53.     if m.numlines>0 then msgisblank:=false else begin
  54.       writestr ('Sorry, message blank!');
  55.       msgisblank:=true
  56.     end
  57.   end;
  58.  
  59.   function getrange:boolean;
  60.   begin
  61.     parserange (m.numlines,r1,r2);
  62.     getrange:=r1<>0
  63.   end;
  64.  
  65.   function getlinenum (txt:mstr):boolean;
  66.   begin
  67.     writestr ('Line number to '+txt+':');
  68.     r1:=valu(input);
  69.     r2:=r1;
  70.     if (r1>=1) and (r1<=m.numlines)
  71.       then getlinenum:=true
  72.       else begin
  73.         getlinenum:=false;
  74.         writeln (^R'Invalid line!')
  75.       end
  76.   end;
  77.  
  78.   procedure inslines (r1,r2:integer);
  79.   var n,cnt:integer;
  80.   begin
  81.     n:=r2-r1+1;
  82.     m.numlines:=m.numlines+n;
  83.     for cnt:=m.numlines downto r2+1 do m.text[cnt]:=m.text[cnt-n]
  84.   end;
  85.  
  86.   procedure dellines (r1,r2:integer);
  87.   var n,cnt:integer;
  88.   begin
  89.     n:=r2-r1+1;
  90.     m.numlines:=m.numlines-n;
  91.     for cnt:=r1 to m.numlines do m.text[cnt]:=m.text[cnt+n]
  92.   end;
  93.  
  94.   procedure insertline;
  95.   var cnt:integer;
  96.   begin
  97.     if m.numlines=maxmessagesize then exit;
  98.     inslines (curline,curline);
  99.     m.text[curline]:=input;
  100.     curline:=curline+1
  101.   end;
  102.  
  103.   function iseditcommand:boolean;
  104.   begin
  105.     iseditcommand:=(input[1]='/') and (length(input)>0)
  106.   end;
  107.  
  108.   function userissure:boolean;
  109.   begin
  110.     writestr ('Warning!  Message will be erased!');
  111.     writestr ('Confirm [y/n]:');
  112.     userissure:=yes
  113.   end;
  114.  
  115.   procedure topofmsg;
  116.   begin
  117.     writeln (^R'--Top of msg--')
  118.   end;
  119.  
  120.   procedure abortmes;
  121.   begin
  122.     done:=userissure
  123.   end;
  124.  
  125.   procedure backline;
  126.   begin
  127.     if m.numlines<1 then begin
  128.       topofmsg;
  129.       exit
  130.     end;
  131.     writeln (^R'<Correct previous line>');
  132.     curline:=curline-1;
  133.     dellines (curline,curline)
  134.   end;
  135.  
  136.   procedure continuemes;
  137.   begin
  138.     writeln (^B^R^M'Continue your message...');
  139.     curline:=m.numlines+1;
  140.     editmode:=false
  141.   end;
  142.  
  143.   procedure deletelines;
  144.   begin
  145.     if not getrange then exit;
  146.     if (r1=1) and (r2=m.numlines) then begin
  147.       writestr ('Delete whole message? *');
  148.       if not yes then exit
  149.     end;
  150.     dellines (r1,r2)
  151.   end;
  152.  
  153.   procedure seteditmode;
  154.   begin
  155.     if editmode
  156.       then writestr ('You are already in edit mode!')
  157.       else editmode:=true
  158.   end;
  159.  
  160.   procedure fixline;
  161.   var tmp:lstr;
  162.   begin
  163.     if not getlinenum ('fix') then exit;
  164.     setbreak;
  165.     writeln ('Line currently reads:');
  166.     writeln (m.text[r1],^M);
  167.     wordwrap:=false;
  168.     buflen:=cols;
  169.     beginwithspacesok:=true;
  170.     writestr ('Enter new line:'^M'*');
  171.     if length(input)<>0 then m.text[r1]:=input;
  172.     continuemes
  173.   end;
  174.  
  175.   procedure insertlines;
  176.   begin
  177.     if not getlinenum ('insert before') then continuemes;
  178.     curline:=r1
  179.   end;
  180.  
  181.   procedure listmes;
  182.   var cnt,r1,r2:integer;
  183.       linenum:boolean;
  184.   begin
  185.     if msgisblank then exit;
  186.     parserange (m.numlines,r1,r2);
  187.     if r1=0 then exit;
  188.     writestr ('Line numbers? *');
  189.     linenum:=yes;
  190.     write (^R);
  191.     for cnt:=r1 to r2 do begin
  192.       if linenum then writeln (cnt,':');
  193.       writeln (m.text[cnt]);
  194.       if break then exit
  195.     end
  196.   end;
  197.  
  198.   procedure centerline;
  199.   var spaces:lstr;
  200.   begin
  201.     fillchar (spaces[1],80,32);
  202.     if editmode then begin
  203.       setbreak;
  204.       buflen:=cols;
  205.       wordwrap:=false;
  206.       writestr ('Enter line to center:'^M'*')
  207.     end else delete(input,1,1);
  208.     while (length(input)>0) and (input[1]=' ') do delete (input,1,1);
  209.     if length(input)=0 then exit;
  210.     spaces[0]:=chr((cols-length(input)) div 2);
  211.     input:=spaces+input;
  212.     insertline
  213.   end;
  214.  
  215.   procedure clearmes;
  216.   begin
  217.     if userissure then begin
  218.       writestr ('Starting message over...');
  219.       m.numlines:=0;
  220.       curline:=1
  221.     end
  222.   end;
  223.  
  224.   procedure searchandreplace;
  225.   var sfor,repw:lstr;
  226.       l:^lstr;
  227.       ask:boolean;
  228.       cl,cp,sl,max:integer;
  229.  
  230.     procedure replace;
  231.     var new,old:lstr;
  232.     begin
  233.       old:=copy (l^,cp,sl);
  234.       new:=repw;
  235.       if length(new)>0 then
  236.         if old[1] in ['A'..'Z']
  237.           then new[1]:=upcase(new[1]);
  238.       delete (l^,cp,sl);
  239.       while length(l^)+length(new)>cols do l^[0]:=pred(l^[0]);
  240.       insert (new,l^,cp);
  241.       cp:=cp+length(new)-1
  242.     end;
  243.  
  244.     procedure maybereplace;
  245.     var cnt:integer;
  246.     begin
  247.       if ask then begin
  248.         writeln (^B^M,cl,':'^M,l^);
  249.         for cnt:=1 to cp-1 do write (' ');
  250.         for cnt:=1 to sl do write ('^');
  251.         writeln;
  252.         writestr ('Replace [Y/N]:');
  253.         if not yes then exit
  254.       end;
  255.       replace
  256.     end;
  257.  
  258.   begin
  259.     if msgisblank then exit;
  260.     writestr ('Search for:');
  261.     if length(input)=0 then exit;
  262.     sfor:=upstring(input);
  263.     sl:=length(input);
  264.     writestr ('Replace with:');
  265.     repw:=input;
  266.     writestr ('Ask each time? *');
  267.     ask:=yes;
  268.     max:=length(l^)-sl+1;
  269.     for cl:=1 to m.numlines do begin
  270.       l:=addr(m.text[cl]);
  271.       max:=length(l^)-sl+1;
  272.       cp:=0;
  273.       while cp<max do begin
  274.         cp:=cp+1;
  275.         if match(sfor,copy(l^,cp,sl)) then maybereplace;
  276.         max:=length(l^)-sl+1
  277.       end
  278.     end;
  279.     writeln (^B^M'Search and replace complete')
  280.   end;
  281.  
  282.   procedure savemes;
  283.   begin
  284.     done:=true;
  285.     if m.numlines=0
  286.       then writestr ('Message blank!')
  287.       else begin
  288.         writestr ('Saving..');
  289.         linereedit:=true
  290.       end
  291.   end;
  292.  
  293.   procedure retitle;
  294.   begin
  295.     if gettitle then begin
  296.       writeln (^R'Title is: '^S+m.title);
  297.       writestr ('Enter new title: &');
  298.       if length(input)>0 then m.title:=input
  299.     end else writestr ('This message can''t have a title.')
  300.   end;
  301.  
  302.   procedure edithelp;
  303.   begin
  304.     printfile (configset.textfiledi+'Edithelp.');
  305.     editmode:=true
  306.   end;
  307.  
  308.   procedure editcommand;
  309.   var k:char;
  310.   begin
  311.     while iseditcommand and (length(input)>0) do delete (input,1,1);
  312.     if length(input)=0 then begin
  313.       editmode:=true;
  314.       exit
  315.     end;
  316.     k:=upcase(input[1]);
  317.     case k of
  318.       'A':abortmes;
  319.       'B':backline;
  320.       'C':continuemes;
  321.       'D':deletelines;
  322.       'E':seteditmode;
  323.       'F':fixline;
  324.       'I':insertlines;
  325.       'L':listmes;
  326.       'M':centerline;
  327.       'N':clearmes;
  328.       'R':searchandreplace;
  329.       'S':savemes;
  330.       'T':retitle
  331.       else edithelp
  332.     end
  333.   end;
  334.  
  335.   procedure editcommands;
  336.   begin
  337.     editcommand;
  338.     while editmode and not done do begin
  339.       writestr (^M'Edit command [?=help]:');
  340.       if hungupon then done:=true else editcommand
  341.     end
  342.   end;
  343.  
  344.   procedure getline;
  345.   begin
  346.     setbreak;
  347.     input:='/E';
  348.     if m.numlines=maxmessagesize then begin
  349.       writeln ('Sorry, message is full!');
  350.       exit
  351.     end;
  352.     if hungupon then exit;
  353.     if m.numlines=maxmessagesize-3 then writeln ('3 lines left!');
  354.     if curline>m.numlines+1 then curline:=m.numlines+1;
  355.     lastprompt:='Continue your message...'^M;
  356.     buflen:=cols;
  357.     getstr;
  358.     if input=^H
  359.       then if curline>1
  360.         then
  361.           begin
  362.             writeln ('--Back--');
  363.             curline:=curline-1;
  364.             chainstr:=m.text[curline];
  365.             dellines (curline,curline)
  366.           end
  367.         else topofmsg
  368.       else if not iseditcommand then insertline
  369.   end;
  370.  
  371.   procedure getlines;
  372.   begin
  373.     repeat
  374.       getline
  375.     until hungupon or iseditcommand or (m.numlines=maxmessagesize);
  376.     if not iseditcommand then input:='/'
  377.   end;
  378.  
  379. begin
  380.   init;
  381.   repeat
  382.     getlines;
  383.     editcommands
  384.   until done;
  385.   writeln (^B^M^M)
  386. end;
  387.  
  388. begin
  389. end.
  390.  
  391.